### 项目四 无源蜂鸣器播放音乐

1.项目介绍

本实验用无源蜂鸣器播放音乐，无源蜂鸣器是通过PWM脉冲宽度调制脉冲进而调节音调，PWM比较多用于调节LED灯的亮度或者调节无源蜂鸣器的频率，或者是电机的转动速度，电机带动的车轮速度也就能很容易控制了，在玩一些Arduino机器人时，更能体现PWM的好处。

音乐除了要“唱的准”，还要“节奏对”，每一个音符的持续时间，就是节拍啦。我们可以用延时多少来设置节拍的，例如：1拍，1秒即1000毫秒；1/2拍，0.5秒即500毫秒；1/4拍，0.25秒即250毫秒；1/8拍，0.125秒即125毫秒….，我们可以试一试组合不同的音调和节拍，看看会有什么不同的效果。

2.模块相关资料

![](./media/image-20250722115454175.png)

- 工作电压：3.3-5V（DC）
- 电流：50MA
- 工作温度：-10摄氏度 到 +50摄氏度
- 尺寸：31.6mmx23.7mm
- 接口：3PIN接口
- 输入信号：数字信号（方波）

3.实验组件

| 控制板 * 1                               | 扩展板 * 1                               | USB线*1                                  | 无源蜂鸣器模块                           | 3P 转杜邦线母 *1                         |
| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| ![](./media/image-20250722105621894.png) | ![](./media/image-20250722105632148.png) | ![](./media/image-20250722105645371.png) | ![](./media/image-20250722115813427.png) | ![](./media/image-20250722105711010.png) |

4.模块接线图

![](./media/image-20250722115838504.png)

5.测试代码

```
/*
  Keyes Arduino智能家居套装
  第4课 无源蜂鸣器
  http://www.keyes-robot.com
*/

void setup()
{
  pinMode(3, OUTPUT);        //设置3为输出
}

void loop()
{
  tone(3,392);          //控制引脚3输出模拟值为262的脉冲
  delay(125);         //延迟125毫秒   
  tone(3,392);
  delay(125);
  tone(3,440);
  delay(250);
  tone(3,392);
  delay(250);
  tone(3,532);
  delay(250);
  tone(3,494);
  delay(500);
  tone(3,392);
  delay(125);
  tone(3,392);
  delay(125);
  tone(3,440);
  delay(250);
  tone(3,392);
  delay(250);
  tone(3,587);
  delay(250);
  tone(3,532);
  delay(500);
  tone(3,392);
  delay(125);
  tone(3,392);
  delay(125);
  tone(3,784);
  delay(250);
  tone(3,659);
  delay(250);
  tone(3,532);
  delay(250);
  tone(3,494);
  delay(250);
  tone(3,440);
  delay(250);
  tone(3,392);
  delay(125);
  tone(3,392);
  delay(125);
  tone(3,330);
  delay(250);
  tone(3,262);
  delay(250);
  tone(3,587);
  delay(250);
  tone(3,532);
  delay(500);
}
```

6.实验结果

上传代码到开发板，就会听到无源蜂鸣器播放这首“生日快乐歌”了

7.代码说明

在音乐中有两个重要的因素：音调和节拍

在音乐课上，老师教过我们唱“1（Do）、2（Re）、3(Mi)、4(Fa) 、5(Sol) 、6(La) 、7(Si)”是音乐当中的唱名，就对应了音调中的C、D、E、F、G、A、B这些音名。

 1（Do） 2（Re） 3(Mi) 4(Fa) 5(Sol) 6(La) 7(Si)

 C D E F G A B

比如程序 tone(3,262););的意思是让引脚3输出模拟值为262的脉冲，即对应音调1（D0）;同理2（Re）、3(Mi)、4(Fa) 、5(Sol) 、6(La) 、7(Si)的音调分别对应输出模拟值为294，330，349，196，440，494的脉冲。

频率（音调）高低判断时先看后面的数字，数字越大，音调越高，数字相同时看前面的字母，从C到B频率（音调）越来越高；而节拍是音符延时时间，数值越大，延时时间越长。这里我按照“生日快乐歌”来设计了音调和节拍，我们先来看它的简谱：

![](./media/image-20250722120033436.png)

节拍是指每个音符持续的时间。音谱中不带线的一个音符就是一拍，延时1000毫秒，而带一条下划线的音符节拍是不带线音符节拍的1/2，带两条下划线的音符节拍是不带线音符节拍的1/4（动画：根据对话圈出相应的音符和标注）。

![](./media/image-20250722120051092.png)


例如：第一个音符下面有两条线，所以就是1/4拍，延时250毫秒。